package com.example.chatroom.component;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

// todo：通过该类来记录用户的在线状态 ->维护了 userId 和 WebSocketSession 之间的关系
@Component
public class OnlineUserManager {
    // 该哈希表考虑到线程安全问题
    private ConcurrentHashMap<Integer, WebSocketSession> sessionList = new ConcurrentHashMap<>();

    // 用户上线，往该哈希表添加元素
    public void online(int userId, WebSocketSession session) throws IOException {
        // 检查是否已经存在该用户的 WebSocketSession
        WebSocketSession existedSession = sessionList.get(userId);
        if(existedSession != null) {
            System.out.println("[" + userId + "] 已经上线，关闭上线用户！");
            // 关闭前一个登录的 WebSocketSession
            existedSession.close();
        }
        sessionList.put(userId,session);
        System.out.println("[" + userId + "] 上线！");
    }

    // 用户下线，从该哈希表删除元素
    public void offline(int userId, WebSocketSession session){
        WebSocketSession existedSession = sessionList.get(userId);
        if(session != existedSession) return;
        sessionList.remove(userId);
        System.out.println("[" + userId + "] 下线！");
    }

    // 根据userId 获取 WebSocketSession
    public WebSocketSession getWebSocketSession(int userId){
        return sessionList.get(userId);
    }
}
